<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>[2.14]-测试驱动开发：意图导向编程下的接口开发 | PhalApi(π框架) - PHP轻量级开源接口框架 - 助你创造价值！</title>
    <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
    <meta content="yes" name="apple-mobile-web-app-capable">
    <meta content="black" name="apple-mobile-web-app-status-bar-style">
    <meta content="telephone=no" name="format-detection">
    <meta content="email=no" name="format-detection">
    <meta name="Author" content="PhalApi,ecitlm,dogstar">
    <meta name="description" content="[2.14]-测试驱动开发：意图导向编程下的接口开发，PhalApi是一个PHP轻量级开源接口框架，致力于快速开发接口服务。支持HTTP/SOAP/RPC等协议，可用于搭建接口/微服务/RESTful接口/Web Services。我们不断更新，保持生气；为接口负责，为开源负责！并承诺永久免费！">
    <meta name="keywords" content="PhalApi,phalapi,phalapi接口开发,后台接口开发,后台接口开发框架,接口开发,接口框架,开源接口框架,PHP后台接口开发,PHP接口开发,PHP接口框架,PHP后台接口框架,phalapi官网,PHP接口框架,php接口开发框架,php接口开发,php web框架,π框架,π开发框架,π接口框架,π接口开发框架,api接口,php接口,,PHP接口框架,phalapi文档,phalapi wiki,PhalApi文档,phalapi在线文档,phalapi官方文档">

    <link rel="stylesheet" type="text/css" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" media="screen">
    <link rel="stylesheet" type="text/css" href="https://cdn.bootcss.com/font-awesome/4.7.0/css/font-awesome.css" media="screen">
    <link rel="stylesheet" href="../css/main.css" />
    <link rel="stylesheet" href="../css/loading_bar.css" />
    <link rel="icon" href="http://webtools.qiniudn.com/dog_catch.png" type="image/x-icon" />
    <script src="../js/pace.min.js"></script>
	
	<!-- 代码高亮 -->
	<link rel="stylesheet" href="../css/highlight.min.css">
	<script src="../js/highlight.min.js"></script>
	<script>hljs.initHighlightingOnLoad();</script>
    
</head>

<body>
    <!-- navbar start -->
    <div class="navbar navbar-default navbar-fixed-top" id="mainnav" role="navigation">
        <div class="container">
            <div class="navbar-header">
                <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target=".navbar-collapse">
                    <span class="sr-only">Toggle navigation</span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                <a class="navbar-brand website_name" href="/"><!-- <span>PhalApi</span> --><strong></strong></a>
            </div>
            <div class="navbar-collapse collapse" aria-expanded="false" style="height: 1px;">
                <ul class="nav navbar-nav navbar-right" id="nav_bar">
                    <li><a href="https://www.phalapi.net/"><span class="glyphicon glyphicon-home"></span></a></li>
                    <li><a href="https://www.phalapi.net/download.html">下载</a></li>
                    <li class="active"><a href="https://www.phalapi.net/wikis/">文档</a></li>
                    <li><a href="https://www.phalapi.net/donate.html">贡献</a></li>
                    <li><a href="#">|</a></li>
                    <li><a href="http://qa.phalapi.net/" target="_blank">社区</a></li>
                    <li><a href="http://www.ituring.com.cn/book/2405" target="_blank">书籍</a></li>
                    <li><a href="http://demo.phalapi.net/listAllApis.php" target="_blank">体验</a></li>
                    <li><a href="https://github.com/phalapi/phalapi-library" target="_blank">扩展</a></li>
                </ul>
            </div>
            <!--/.nav-collapse -->
        </div>
    </div>
    <!-- navbar end -->


    <div id="content">
        <div class="container">
            <div class="row row-md-flex row-md-flex-wrap">
                <h4><a href="/wikis/%5B2.13%5D-%E6%8E%A5%E5%8F%A3%E8%B0%83%E8%AF%95%EF%BC%9A%E5%9C%A8%E7%BA%BFSQL%E8%AF%AD%E5%8F%A5%E6%9F%A5%E7%9C%8B%E4%B8%8E%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96.html">上一章</a>   <a href="/wikis/">文档首页</a>   <a href="/wikis/%5B2.15%5D-%E6%BC%94%E8%BF%9B%EF%BC%9A%E6%96%B0%E5%9E%8B%E8%AE%A1%E5%88%92%E4%BB%BB%E5%8A%A1%E7%BB%AD%E7%AF%87.html">下一章</a></h4>
<hr />
<p><em>有的时候宁愿付钱让你一周在床上待着，也不想让你用这周剩下的时间去调试你在周一所写的代码。 --丹·所罗门</em>  </p>
<h2>2.14.1 测试驱动开发</h2>
<p>做正确的事，比把事情做正确更为重要。  </p>
<p>当明确需要做何事后，再通过事先编写单元测试来准确表达我们将要实现的功能，是相当具有指导意义的。你会发现接下来你的开发历程就是：单元测试-设计-重构，而且这种正向循环是很有创造性的，并且进行到一定程度后会慢慢体会到浮现式设计的乐趣。  </p>
<p>关于测试驱动开发TDD，有很多资料已进行了说明，这里不再赘述。  </p>
<p>如果还没了解PHPUnit，可先阅读：<a href="https://phpunit.de/manual/3.7/zh_cn/automating-tests.html">PHPUnit 手册</a><br />
如果还没了解PHPUnit，可先阅读：<a href="https://phpunit.de/manual/3.7/zh_cn/automating-tests.html">PHPUnit 手册</a><br />
如果还没了解PHPUnit，可先阅读：<a href="https://phpunit.de/manual/3.7/zh_cn/automating-tests.html">PHPUnit 手册</a>  </p>
<h2>2.14.2 意图导向编程</h2>
<p><img src="http://webtools.qiniudn.com/20150411005257_2bc8683a50ac1d620cef4e39918ed3e5" alt="apic" />  </p>
<p>在编写代码前，先写测试代码，更容易提高 <strong>关注点</strong> 。  </p>
<p>因为，在开发过程中， 大多时候会被外界打断（如需求沟通、线上问题处理、临时会议等），而通过单元测试则可以让你“几乎忘却需要做什么”的情况下重新让你回到之前的状态，特别在并行开发多个不同项目的需求时尤其重要。  </p>
<p>除此之外，遵循“红-绿-重构”这样的流程，我们可以在更高的层面关注需要实现的功能需求，并自顶而下地进行设计优化，精益代码。  </p>
<h2>2.14.3 编写测试的原则、模式和指导</h2>
<p>首先应该意识到，测试代码和生产代码一样重要。其次，测试代码也应该和生产代码一样被同步维护更新，这样才能保持生气，更大地发挥作用。只有当不断地对测试的代码进行修修补被，我们才能保持自动化测试这张“安全网”常新。</p>
<h2>2.14.4 F.I.R.S.T.原则</h2>
<ul>
<li>快速 Fast</li>
<li>独立 Independent</li>
<li>可重复 Repeatable</li>
<li>自足验证 Self-validating</li>
<li>及时 Timely</li>
</ul>
<h2>2.14.5 构造-操作-检验（BUILD-OPERATE-CHECK）模式</h2>
<p>这个模式也可以理解成：“当... 做...应该...”。其中，构造包括测试环境的搭建、测试数据前期的准备；操作是指对被测试对象的调用， 以及被测试对象之间的通信和协助交互；最后检验则是对业务规则的断言、对功能需求的验证。</p>
<h2>2.14.6 如何编写高效测试代码</h2>
<ul>
<li>1、与产品代码分开，与测试代码对齐</li>
<li>2、利用测试骨架（phpunit-skelgen或者自定义生成器）自动生成测试代码</li>
<li>3、使用测试替身、测试桩构建昂贵资源、制造异常情况</li>
<li>4、每个测试一个概念</li>
</ul>
<h2>2.14.7 PhalApi开发下的单元测试</h2>
<p>我们推荐在各自的项目代码中平行编写单元测试，并逐渐完善、保持同步。以下是进行单元测试的参考。</p>
<h3>(1)Api接口层的单元测试</h3>
<p>Api接口层，是我们后台开发的主要切入点，也是直接对外提供服务的入口，属于更高层次的概念并拥有指定的业务功能，更是后台开发的关注点。所以在对新接口进行开发前，编写单元测试是非常有意义的。  </p>
<p>为了可以自动生成测试代码，我们可以先简单定义好接口的函数签名（以获取用户基本信息接口为例）：</p>
<pre><code class="language-php">//$ vim ./Demo/Api/User.php 
&lt;?php

class Api_User extends PhalApi_Api {

    public function getBaseInfo() {
    }

}</code></pre>
<p>随后，自动生成测试代码骨架：</p>
<pre><code class="language-bash">$ mkdir ./Demo/Tests/Api -p
$ cd ./Demo/Tests/Api
$ php ./PhalApi/build_phpunit_test_tpl.php ./Demo/Api/User.php Api_User ./Public/init.php
$ php ./PhalApi/build_phpunit_test_tpl.php ./Demo/Api/User.php Api_User ./Public/init.php &gt; ./Demo/Tests/Api/Api_User_Test.php</code></pre>
<p>根据接口的需要，验证接口返回的格式，以及业务数据的正确性。</p>
<pre><code class="language-php">//$ vim ./Demo/Tests/Api/Api_User_Test.php
    /**
     * @group testGetBaseInfo
     */
    public function testGetBaseInfo()
    {
        //Step 1. 构建请求URL
        $url = 'service=User.GetBaseInfo&amp;user_id=1';

        //Step 2. 执行请求  
        $rs = PhalApi_Helper_TestRunner::go($url);

        //Step 3. 验证
        $this-&gt;assertNotEmpty($rs);
        $this-&gt;assertArrayHasKey('code', $rs);
        $this-&gt;assertArrayHasKey('msg', $rs);
        $this-&gt;assertArrayHasKey('info', $rs);

        $this-&gt;assertEquals(0, $rs['code']);

        $this-&gt;assertEquals('dogstar', $rs['info']['name']);
        $this-&gt;assertEquals('oschina', $rs['info']['note']);
    }</code></pre>
<p>上面的验证意思简单明了，结合 <strong>构造-操作-检验（BUILD-OPERATE-CHECK）模式</strong> 加以说明一下。  </p>
<h3>构造：构建请求URL</h3>
<pre><code class="language-php">        //Step 1. 构建请求URL
        $url = 'service=User.GetBaseInfo&amp;user_id=1';</code></pre>
<p>此参数即对应接口请求的URL参数，我们将此参数追加在接口入口并在浏览器打开可以得到同样的接口执行效果。但这样的好处更在于通过单元测试帮我们记住了各种接口测试的业务场景。而不再是像以前那样打开N个浏览器窗口人工进行调试，也不用像以前那样苦苦寻找浏览器记录。</p>
<p>如果接口需要POST数据，或者其他更多参数，可以使用$params来传递更多参数，一如：  </p>
<pre><code class="language-php">        //Step 1. 构建请求URL
        $url = 'service=User.GetBaseInfo&amp;user_id=1';
        $params = array(); //更多参数

        //Step 2. 执行请求  
        $rs = PhalApi_Helper_TestRunner::go($url, $params); //通过第二个参数，传送更多参数</code></pre>
<h4>操作：执行请求</h4>
<p>这里的操作，显然就是对应我们接口的调用。简单地如：</p>
<pre><code class="language-php">        //Step 2. 执行请求  
        $rs = PhalApi_Helper_TestRunner::go($url);</code></pre>
<p>这样，便可以在服务端模拟进行一次接口的请求调度，注意这里是在服务端进行的接口请求，而不是客户端。<br />
此外，如果需要传递更多参数，可以参考前面的示例。这里简单补充一下PhalApi_Helper_TestRunner测试辅助类的接口签名说明：  </p>
<pre><code>&lt;?php
class PhalApi_Helper_TestRunner {

    /**
     * @param string $url 请求的链接
     * @param array $param 额外POST的数据
     * @return array 接口的返回结果
     */
    public static function go($url, $params = array()) {

        ... ...</code></pre>
<h4>检验：验证</h4>
<p>在对接口返回的结果中，我们可以这样依次进行正确性的验证：</p>
<ul>
<li>1、先验证接口返回的格式是否正确，有无字段遗漏；</li>
<li>2、返回的业务数据是否正确；</li>
</ul>
<pre><code class="language-php">        //Step 3. 验证
        $this-&gt;assertNotEmpty($rs);
        $this-&gt;assertArrayHasKey('code', $rs);
        $this-&gt;assertArrayHasKey('msg', $rs);
        $this-&gt;assertArrayHasKey('info', $rs);

        $this-&gt;assertEquals(0, $rs['code']);

        $this-&gt;assertEquals('dogstar', $rs['info']['name']);
        $this-&gt;assertEquals('oschina', $rs['info']['note']);</code></pre>
<p>由于测试环境的数据变动频繁，所以我们可以针对个别的接口进行更精确的验证，而对类似列表获取这样的大批量的数据，则校验其结构格式。<br />
除此之外，还有一种情况也是需要纳入检验，即除了上面的正常请求情况下的 <strong>异常请求</strong> 。  </p>
<p>接下来的即是之前文档里面所说的单元测试执行和接口开发，此处略。  </p>
<h3>(2)Domain层和Model层的单元测试</h3>
<p>下面继续简单补充一下之前没谈及到的Domain层和Model层的单元测试。   </p>
<p>显然，这两层的开发，已经在前面的接口测试驱动开发的指导下很好地完成了。现在可以快速追加对这两层的单元测试。得益于我们的生成测试骨架的脚本，操作如下：</p>
<pre><code class="language-php">$ php ./PhalApi/build_phpunit_test_tpl.php ./Demo/Domain/User.php Domain_User &gt; ./Demo/Tests/Domain/Domain_User_Test.php
$ php ./PhalApi/build_phpunit_test_tpl.php ./Demo/Model/User.php Model_User &gt; ./Demo/Tests/Model/Model_User_Test.php</code></pre>
<p>接着，修改一下测试环境 <strong>test_env.php</strong>的引用路径：</p>
<pre><code class="language-php">//$ vim ./Demo/Tests/Domain/Domain_User_Test.php 
//$ vim ./Demo/Tests/Model/Model_User_Test.php

require_once dirname(__FILE__) . '/../test_env.php';</code></pre>
<p>各自完善一下单元测试：</p>
<pre><code class="language-php">//$ vim ./Demo/Tests/Domain/Domain_User_Test.php

    /**
     * @group testGetBaseInfo
     */
    public function testGetBaseInfo()
    {
        $userId = '1';

        $rs = $this-&gt;domainUser-&gt;getBaseInfo($userId);

        $this-&gt;assertArrayHasKey('id', $rs);
        $this-&gt;assertArrayHasKey('name', $rs);
        $this-&gt;assertArrayHasKey('note', $rs);

        $this-&gt;assertEquals('dogstar', $rs['name']);
    }</code></pre>
<p>执行一下：</p>
<pre><code class="language-bash">$ phpunit ./Demo/Tests/Domain/Domain_User_Test.php 
PHPUnit 4.3.4 by Sebastian Bergmann.

.

Time: 49 ms, Memory: 6.25Mb

OK (1 test, 4 assertions)</code></pre>
<h3>(3)Model层的单元测试</h3>
<p>Model层的单元测试类似，不再赘述。</p>
<h2>2.14.7 更进一步的单元测试套件</h2>
<p>到目前为止，我们有了如下的产品代码：</p>
<pre><code class="language-bash">dogstar@ubuntu:Demo$ tree
.
├── Api
│   └── User.php
├── Domain
│   └── User.php
├── Model
│   └── User.php</code></pre>
<p>并拥有了与之平行对应的单元测试：</p>
<pre><code class="language-bash">dogstar@ubuntu:Tests$ tree
.
├── Api
│   └── Api_User_Test.php
├── Domain
│   └── Domain_User_Test.php
├── Model
│   └── Model_User_Test.php
└── test_env.php</code></pre>
<p>这样是一个很好的开始，但若我们每次测试都分别调用三次这些不同层次的单元测试，显然有点不科学。所以，利用PHPUnit的配置文件，我们可以轻松管理我们的测试套件，如：</p>
<pre><code class="language-xml">&lt;!-- dogstar@ubuntu:Tests$ vim ./phpunit_user_getbaseinfo.xml --&gt;

&lt;?xml version="1.0" encoding="UTF-8"?&gt;

&lt;phpunit backupGlobals="false"
    ...

    &lt;testsuites&gt;
        &lt;testsuite name="Test Suite"&gt;
            &lt;file&gt;./Api/Api_User_Test.php&lt;/file&gt;
            &lt;file&gt;./Domain/Domain_User_Test.php&lt;/file&gt;
            &lt;file&gt;./Model/Model_User_Test.php&lt;/file&gt;
        &lt;/testsuite&gt;
    &lt;/testsuites&gt;
&lt;/phpunit&gt;</code></pre>
<p>啊哈！终于，当需要调用这些分布在不同目录位置的单元测试时，只需要这么简单的一行命令：</p>
<pre><code class="language-bash">dogstar@ubuntu:Tests$ phpunit -c ./phpunit_user_getbaseinfo.xml 
PHPUnit 4.3.4 by Sebastian Bergmann.

.....

Time: 54 ms, Memory: 7.25Mb

OK (5 tests, 28 assertions)</code></pre>
<h2>2.14.8 这样的好处？</h2>
<p>上面的过程，细节较多，而且需要实际操作的部分也比较多。对于之前没有接触过单元测试这块的同学，可能会有点迷茫，对于不愿意接受单元测试的同学来说更加枯燥。  </p>
<p>然而，然而。  当我们把越痛苦的事情越早完成后，我们后面就顺畅多了。正如在某一次培训中的某一位敏捷开发的专家所说的： <em>要逐步对小问题做优化，而不是要等到大问题到来时再做变革</em> 。  </p>
<h3>那这样的好处在于哪里呢？</h3>
<p>这里不就理论回答，而是以我个人的经历来简单说明。  </p>
<p>首先，正如上面所说的，单元测试帮你很好地记住并整理了各种接口测试的场景，而不用再像以前那样打开N个浏览器窗口逐个人工校对。<br />
其次，在单元测试的论证下我们可以更有信心地跟测试说、跟产品说、跟发布说我们的代码没问题，因为我们通过严格的单元测试，而不是人为主观上的想当然应该不会有问题吧。<br />
最后，也是最重要的，在后期的接口升级、改动和维护中，单元测试再一次为我们提供了保护，犹如一张安全网，涵盖我们改动的每一处代码。与此同时，对于重构也亦然。 </p>
<p>但单元测试所带给你的，不仅仅是上面所说的简单这几点。更多地完全不一样的开发历程，而其中滋味和令人兴奋的体现，只有当你亲自去尝试才会明白其中滋味。So, try it by yourself.</p>
<hr />
<h4><a href="/wikis/%5B2.13%5D-%E6%8E%A5%E5%8F%A3%E8%B0%83%E8%AF%95%EF%BC%9A%E5%9C%A8%E7%BA%BFSQL%E8%AF%AD%E5%8F%A5%E6%9F%A5%E7%9C%8B%E4%B8%8E%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96.html">上一章</a>   <a href="/wikis/">文档首页</a>   <a href="/wikis/%5B2.15%5D-%E6%BC%94%E8%BF%9B%EF%BC%9A%E6%96%B0%E5%9E%8B%E8%AE%A1%E5%88%92%E4%BB%BB%E5%8A%A1%E7%BB%AD%E7%AF%87.html">下一章</a></h4><div style="float: left">
<h4>
<a href="http://qa.phalapi.net/">还有疑问？欢迎到社区提问！</a>
&nbsp;&nbsp;
<a href="http://docs.phalapi.net/#/v2.0/">切换到PhalApi 2.x 开发文档。</a>
</h4>
</div>
            </div>
        </div>
    </div>

 <!-- 广告位 -->
<div class="grid-wrapper desktop-only">
	<p align="center">
		<a href="http://7xiz2f.com1.z0.glb.clouddn.com/%E6%88%91%E7%9A%84%E5%90%8D%E5%AD%97%E5%8F%AB%EF%BC%9A%CF%80%E6%A1%86%E6%9E%B6%20-%20PhalApi%202016%E5%B9%B4%E5%BA%A6%E5%BC%80%E6%BA%90%E6%80%BB%E7%BB%93%20-%20%E5%AE%98%E6%96%B9%E5%87%BA%E5%93%81.pdf" target="blank"><img width="950" height="100" src="http://7xiz2f.com1.z0.glb.clouddn.com/ad_20170104.png"></a>
		<a href="http://www.itran.cc/" target="blank"><img width="950" height="100" src="http://7xslqv.com1.z0.glb.clouddn.com/images/9/69/b88bc92455dc1239f9a5bf8d72929.png"></a>
		<a href="http://web-tools.phalapi.net/" target="blank"><img width="950" height="100" src="http://7xslqv.com1.z0.glb.clouddn.com/images/7/d0/88f523566c482296aecc43d185ca2.png"></a>
	</p>
</div>

        <!-- footer -->
        <div class="footer">
            <div class="link container ">
                <div class=" col-xs-7 col-sm-7 col-md-7 col-lg-7 ">
                    <h3>PhalApi (π框架)</h3>
                    <p>一个轻量级PHP开源接口框架，专注于接口服务开发，支持HTTP/SOAP/RPC协议，拥有自动生成的在线文档、多种开发语言的客户端SDK包以及可重用的扩展类库，可用于快速搭建微服务、RESTful接口或Web
                        Services。</p>
                    <!-- <p>:</p> -->
                    <a href="https://www.phalapi.net/" target="_blank"> PhalApi </a>
                    <span>|</span>
                    <a href="http://qa.phalapi.net/" target="_blank">社区</a>
                    <span>|</span>
                    <a href="download.html" target="_blank">下载</a>
                    <span>|</span>
                    <a href="/wikis/">文档</a>
                    <span>|</span>
                    <a href="http://www.ituring.com.cn/book/2405" target="_blank">书籍</a>
                    <span>|</span>
                    <a href="http://demo.phalapi.net/listAllApis.php" target="_blank">体验</a>
                    <span>|</span>
                    <a href="donate.html" target="_blank">贡献</a>
                    <span>|</span>
                    <a href="https://github.com/phalapi/phalapi-library" target="_blank">扩展</a>
                    <span>|</span>
                    <a href="/license.html" target="_blank">许可</a>
                    <span>|</span>
                    <a href="/about.html" target="_blank">关于</a>
                    <span>|</span>
                    <a href="https://www.phalapi.net/wikis/en/" target="_blank">English</a>

                </div>
                <div class=" col-xs-5 col-sm-5 col-md-5 col-lg-5 contact_us ">
                    <h3>联系我们</h3>
                    <a href="https://github.com/phalapi/phalapi"><img src="../images/github.png" alt="github" /></a>
                    <a href="http://weibo.com/p/100808d236e99beb645bfb56ed1c37dde9b8bd?k=phalapi%E5%BC%80%E6%BA%90%E6%A1%86%E6%9E%B6&from=501&_from_=huati_topic"><img src="../images/weibo.png"  alt="weibo" /></a>
                    <a href="http://7xslqv.com1.z0.glb.clouddn.com/images/1/b0/894fde762850cb11250253f7d5ede.png"><img src="../images/zfb.png"  alt="zfb" /></a>
					<a target="_blank" href="//shang.qq.com/wpa/qunwpa?idkey=f16292029e59975d4ccfccc70ed87aa5c5646df512e83b0e9e1270e8368be461"><img border="0" src="images/qq.png" alt="π框架 - PhalApi交流群②" title="π框架 - PhalApi交流群②"></a>
					<a href="http://git.oschina.net/dogstar/PhalApi"><img src="../images/git-oschina.png"  alt="git-oschina" /></a>
                </div>
                <div class="cls"></div>
                <div class="text-center copy_right"> ©2015-2017 PhalApi All Rights Reserved. <a href="http://www.miitbeian.gov.cn" target="_blank">粤ICP备15028808号</a>

				<script type="text/javascript">var cnzz_protocol = (("https:" == document.location.protocol) ? " https://" : " http://");document.write(unescape("%3Cspan id='cnzz_stat_icon_1255326144'%3E%3C/span%3E%3Cscript src='" + cnzz_protocol + "s4.cnzz.com/z_stat.php%3Fid%3D1255326144%26show%3Dpic' type='text/javascript'%3E%3C/script%3E"));</script>
                </div>
            </div>
        </div>
    </div>


    <a href="https://github.com/phalapi"><img id="gitHub_fllow" style="position: fixed; top: 0; right: 0; border: 0;z-index:9999" src="https://camo.githubusercontent.com/652c5b9acfaddf3a9c326fa6bde407b87f7be0f4/68747470733a2f2f73332e616d617a6f6e6177732e636f6d2f6769746875622f726962626f6e732f666f726b6d655f72696768745f6f72616e67655f6666373630302e706e67" alt="Fork me on GitHub" data-canonical-src="https://s3.amazonaws.com/github/ribbons/forkme_right_orange_ff7600.png"></a>


    <script src="../js/jquery-1.11.1.min.js"></script>
    <script src="../js/bootstrap.min.js"></script>
</body>

</html>